#include "../../include/CarController.h"

/**
 * 无参构造
 */
CarController::CarController() {}
/**
 * 析构函数
 */
CarController::~CarController() {
    clearMap(carMap);
}
/**
 * 创建智能小车
 */
SmartCar* CarController::createCar() {
    SmartCar* newCar = new SmartCar();
    carMap[newCar->id] = newCar;
    return newCar;
}
/**
 * 创建智能小车
 */
SmartCar* CarController::createCar(const std::string id) {
    SmartCar* newCar = new SmartCar(id);
    carMap[id] = newCar;
    return newCar;
}

/**
 * 创建智能小车-根据模板小车
 */
SmartCar* CarController::createCar(SmartCar* sampleCar) {
    SmartCar* newCar = new SmartCar(sampleCar);
    carMap[newCar->id] = newCar;
    return newCar;
}
/**
 * 查找智能小车
 */
SmartCar* CarController::findCar(const std::string id) {
    std::unordered_map<std::string,SmartCar*>::iterator iter = carMap.find(id);
    if(iter == carMap.end()) {
        return nullptr;
    }
    return iter->second;
}
/**
 * 删除智能小车
 */
void CarController::deleteCar(SmartCar* car) {
    if(carMap.find(car->id) == carMap.end()) {
        return;
    }
    carMap.erase(car->id);
    // idCreater->countDecrease("SmartCar");
    delete car;
}
/**
 * 返回智能小车数量
 */
int CarController::getCarCount() {
    return carMap.size();
}
/**
 * 获取所有智能小车
 */
void CarController::listAllCar(SmartCar* (&carList)[]) {
    std::unordered_map<std::string,SmartCar*>::iterator iter;
    int idx = 0;
    for(iter=carMap.begin();iter!=carMap.end();iter++) {
        carList[idx] = iter->second;
        idx += 1;
    }
}
/**
 * 从字符串中解析出智能小车类
 */
SmartCar* CarController::strToSmartCar(std::istringstream &iss) {
    char split = ' ';
	std::string token;		// 接收缓冲区
    IdManager* idManager = IdManager::getIdManager();

    // 接收起始符号
    std::getline(iss, token, split);
    // 检验起始符号
    if(token != "car:") {
        return nullptr;
    }
    // 接收小车ID
    std::getline(iss, token, split);
    // 创建小车
    SmartCar* car = new SmartCar(token);
    carMap[token] = car;
    idManager->addId("SmartCar",token);
    // 接收组件列表个数
    std::getline(iss, token, split);
    int nComponent = std::stoi(token);
    // 接收组件列表
    for(int i=0;i<nComponent;i++) {
        Component* component = Component::strToComponent(iss);
        car->addComponent(component);
    }
    // 接收终止符号
    std::getline(iss, token, split);
    // 检验终止符号
    if(token != ":car") {
        return nullptr;
    }
    return car;
}